package com.osdp.gateway.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 动态路由自定义属性绑定值，可通过配置文件配置属性。
 *
 * Spring Boot源码中大量使用@ConditionalOnProperty来控制Configuration是否生效。
 * 如果发现@ConfigurationPropertie不生效，有可能是项目的目录结构问题，
 * 可以通过@EnableConfigurationProperties(ConnectionSettings.class)来明确指定需要用哪个实体类来装载配置信息。
 * 也可以定义为@Component
 *
 * Nacos有分类管理的操作。抛出三个概念，namespace(命令空间)、group(分组)、dataid:
 * dataid：Nacos 中的某个配置集的 ID(如：spring.application.name: MicroGateway)，配置集 ID是组织划分配置的维度之一。Data ID通常用于组织划分系统的配置集。
 *         一个系统或者应用可以包含多个配置集，每个配置集都可以被一个有意义的名称标识。就是配置文件的名字，相当于主键的作用。
 *         dataId 的完整格式如下:${prefix}-${spring.profiles.active}.${file-extension}
 *         prefix 默认为 spring.application.name 的值
 *         file-extension 目前只支持 properties 和 yaml 类型。
 * group(分组): Nacos 中的一组配置集，是组织配置的维度之一。通过一个有意义的字符串（如 Buy 或 Trade ）对配置集进行分组，从而区分 Data ID 相同的配置集。
 *              不同的系统或微服务的配置文件可以放在一个组里。同一项目，不同模块需要隔离,比如用户系统和订单系统的配置文件都可以放在同个组中。
 * 命名空间(namespace): 用于进行租户粒度的配置隔离。不同的命名空间下，可以存在相同的 Group 或 Data ID 的配置。
 *                      Namespace 的常用场景之一是不同环境的配置的区分隔离，例如开发测试环境和生产环境的资源（如配置、服务）隔离等。
 * 总的来说，namespace是可以用于区分部署环境的（prod,dev,test)，Group和DataID逻辑上区分两个目标对象。
 *
 */
@ConfigurationProperties("osdp.gateway.config")
@Data
public class OsdpGatewayProperties {
    /** nacos 服务地址 */
    private String serverAddr;

    /** nacos 配置管理  dataId */
    private String dataId;
    /** nacos 配置管理 group */
    private String group;
    /** timeout */
    private long timeout;
    /**
     * nacos 配置管理 namespace(public(保留空间,默认),...)
     */
    private String namespace;
}
